/*
 * Created on 2011-11-02
 *
 */

/**
 * Klasa odpowiedzialna za wyznaczanie liczb Fibonacciego.
 * 
 * n-ta liczba Fibonacciego określona jest wzorem:
 * 
 *   F(n) = F(n-1) + F(n-2)
 *   F(1) = F(2) = 1
 * 
 * Klasa udostępnia metody wyznaczania liczb Fibonacciego.
 * 
 * @author Paweł Rychły
 */
public class Fibonacci
{
	/**
	 * Metoda testująca działanie klasy.
	 * W wyniku wypisuje na ekranie kolejne 10 liczb Fibonacciego,
	 * poprzedzone sprawdzeniem dla niepoprawnego argumentu funkcji.
	 * 
	 * @param args Argumenty wiersza poleceń (nie używane)
	 */
	public static void main(String[] args)
	{
		for (int i = 0; i<10; i++)
			System.out.println(findFibonacci(i));
	}

	
	/**
	 * Funkcja wyznaczająca n-tą liczbę Fibonacciego (n>=1).
	 * Dla niepoprawnej wartości n zwraca -1.
	 * Funkcja nie sprawdza przekraczanie zakresów.
	 * 
	 * @param number Numer liczby Fibonacciego, która ma zostać znaleziona
	 * @return Liczbę Fibonacciego o wskazanym numerze
	 */
	public static long findFibonacci(int number)
	{
		if (number<1)
			return -1;
		
		int prev = 1;
		int curr = 1;

		// W curr jest zarówno 1. jak i 2. liczba F., więc implementacja
		// działa również dla N=1
		
		for (int cnt=2; cnt<number; cnt++)
		{
			int tmp = prev + curr;
			prev = curr;
			curr = tmp;
		}

		return curr;
	}
}
